package com.jrauto.CarAppBackend.utils;

/**
 * @author : huiMing
 * Date : 2025年07月24日 14:19
 * @version V1.0
 */

import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * 通用返回结果类
 * @param <T> 数据类型
 */
@Data
public class R<T> implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    private Integer code; // 业务状态码，例如：200成功，500失败
    private String message;   // 提示信息
    private T data;       // 返回数据

    /**
     * 成功响应，带数据和默认消息
     * @param data 返回的数据
     * @param <T> 数据类型
     * @return 成功响应对象
     */
    public static <T> R<T> ok(T data) {
        return ok("Success", data);
    }

    /**
     * 成功响应，不带数据和默认消息
     * @param <T> 数据类型
     * @return 成功响应对象
     */
    public static <T> R<T> ok() {
        return ok("Success", null);
    }

    /**
     * 成功响应，带自定义消息，不带数据
     * @param msg 自定义消息
     * @param <T> 数据类型
     * @return 成功响应对象
     */
    public static <T> R<T> ok(String msg) {
        return ok(msg, null);
    }

    /**
     * 成功响应，带自定义消息和数据
     * @param message 自定义消息
     * @param data 返回的数据
     * @param <T> 数据类型
     * @return 成功响应对象
     */
    public static <T> R<T> ok(String message, T data) {
        R<T> r = new R<>();
        r.setCode(200);
        r.setMessage(message);
        r.setData(data);
        return r;
    }

    /**
     * 失败响应，带默认错误码500
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 失败响应对象
     */
    public static <T> R<T> fail(String msg) {
        R<T> r = new R<>();
        r.setCode(500);
        r.setMessage(msg);
        return r;
    }

    /**
     * 失败响应，带自定义错误码和信息
     * @param code 错误码
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 失败响应对象
     */
    public static <T> R<T> fail(Integer code, String msg) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setMessage(msg);
        return r;
    }

    /**
     * 客户端请求错误响应 (400 Bad Request)
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 失败响应对象
     */
    public static <T> R<T> badRequest(String msg) {
        return fail(400, msg);
    }

    /**
     * 未授权响应 (401 Unauthorized)
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 失败响应对象
     */
    public static <T> R<T> unauthorized(String msg) {
        return fail(401, msg);
    }



    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
